package com.rljk.utils;

import java.io.File;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketException;
import java.util.List;
import java.util.UUID;

import javax.servlet.http.HttpServletResponse;

import com.rljk.config.property.UploadProperty;
import com.rljk.domain.common.PageData;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

/**
*
*/
public class FTPUtils {
	 private final static Log logger = LogFactory.getLog(FTPUtils.class);  
	
	/**
	 * 上传文件（可供Action/Controller层使用）
	 * @param hostname FTP服务器地址
	 * @param port FTP服务器端口号
	 * @param username FTP登录帐号
	 * @param password FTP登录密码
	 * @param pathname FTP服务器保存目录
	 * @param fileName 上传到FTP服务器后的文件名称
	 * @param inputStream 输入文件流
	 * @return
	 */
	 public static boolean uploadFile(String hostname, int port, String username, String password, String pathname, String fileName, InputStream inputStream){
	 boolean flag = false;
	 FTPClient ftpClient = new FTPClient();
	 ftpClient.setControlEncoding("UTF-8");
	 try {
	 //连接FTP服务器
	 ftpClient.connect(hostname, port);
	 //登录FTP服务器
	 ftpClient.login(username, password);
	 //是否成功登录FTP服务器
	 int replyCode = ftpClient.getReplyCode();
	 if(!FTPReply.isPositiveCompletion(replyCode)){
	 return flag;
	 }
	  
	 ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
	 ftpClient.makeDirectory(pathname);
	 ftpClient.changeWorkingDirectory(pathname);
	 //上传文件
	 ftpClient.enterLocalPassiveMode();
	 boolean storeFile = ftpClient.storeFile(fileName, inputStream);
	 System.out.println(storeFile);
	 inputStream.close();
	 ftpClient.logout();
	 flag = true;
	 } catch (Exception e) {
	 e.printStackTrace();
	 } finally{
	 if(ftpClient.isConnected()){
	 try {
	 ftpClient.disconnect();
	 } catch (IOException e) {
	 e.printStackTrace();
	 }
	 }
	 }
	 return flag;
	 }
	  
	  
	 /**
	 * 上传文件（可对文件进行重命名）
	 * @param hostname FTP服务器地址
	 * @param port FTP服务器端口号
	 * @param username FTP登录帐号
	 * @param password FTP登录密码
	 * @param pathname FTP服务器保存目录
	 * @param filename 上传到FTP服务器后的文件名称
	 * @param originfilename 待上传文件的名称（绝对地址）
	 * @return
	 */
	 public static boolean uploadFileFromProduction(String hostname, int port, String username, String password, String pathname, String filename, String originfilename){
	 boolean flag = false;
	 try {
	 InputStream inputStream = new FileInputStream(new File(originfilename));
	 flag = uploadFile(hostname, port, username, password, pathname, filename, inputStream); 
	 } catch (Exception e) {
	 e.printStackTrace();
	 }
	 return flag;
	 }
	  
	 /**
	 * 上传文件（不可以进行文件的重命名操作）
	 * @param hostname FTP服务器地址
	 * @param port FTP服务器端口号
	 * @param username FTP登录帐号
	 * @param password FTP登录密码
	 * @param pathname FTP服务器保存目录
	 * @param originfilename 待上传文件的名称（绝对地址）
	 * @return
	 */
	 public static boolean uploadFileFromProduction(String hostname, int port, String username, String password, String pathname, String originfilename){
	 boolean flag = false;
	 try {
	 String fileName = new File(originfilename).getName();
	 InputStream inputStream = new FileInputStream(new File(originfilename));
	 flag = uploadFile(hostname, port, username, password, pathname, fileName, inputStream); 
	 } catch (Exception e) {
	 e.printStackTrace();
	 }
	 return flag;
	 }
	  
	  
	 /**
	 * 删除文件
	 * @param hostname FTP服务器地址
	 * @param port FTP服务器端口号
	 * @param username FTP登录帐号
	 * @param password FTP登录密码
	 * @param pathname FTP服务器保存目录
	 * @param filename 要删除的文件名称
	 * @return
	 */
	 public static boolean deleteFile(String hostname, int port, String username, String password, String pathname, String filename){
	 boolean flag = false;
	 FTPClient ftpClient = new FTPClient();
	 try {
	 //连接FTP服务器
	 ftpClient.connect(hostname, port);
	 //登录FTP服务器
	 ftpClient.login(username, password);
	 //验证FTP服务器是否登录成功
	 int replyCode = ftpClient.getReplyCode();
	 if(!FTPReply.isPositiveCompletion(replyCode)){
	 return flag;
	 }
	 //切换FTP目录
	 ftpClient.changeWorkingDirectory(pathname);
	 ftpClient.dele(filename);
	 ftpClient.logout();
	 flag = true;
	 } catch (Exception e) {
	 e.printStackTrace();
	 } finally{
	 if(ftpClient.isConnected()){
	 try {
	 ftpClient.logout();
	 } catch (IOException e) {
	  
	 }
	 }
	 }
	 return flag;
	 }
	

	 /** 
	     * 获取FTPClient对象 
	     * 
	     * @param ftpHost 
	     *            FTP主机服务器 
	     * @param ftpPassword 
	     *            FTP 登录密码 
	     * @param ftpUserName 
	     *            FTP登录用户名 
	     * @param ftpPort 
	     *            FTP端口 默认为21 
	     * @return 
	     */  
	    public static FTPClient getFTPClient(String ftpHost, String ftpUserName,  
	            String ftpPassword, int ftpPort) {  
	        FTPClient ftpClient = new FTPClient();  
	        try {  
	            ftpClient = new FTPClient();  
	            ftpClient.connect(ftpHost, ftpPort);// 连接FTP服务器  
	            ftpClient.login(ftpUserName, ftpPassword);// 登陆FTP服务器  
	            if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {  
	                logger.info("未连接到FTP，用户名或密码错误。");  
	                ftpClient.disconnect();  
	            } else {  
	                logger.info("FTP连接成功。");  
	            }  
	        } catch (SocketException e) {  
	            e.printStackTrace();  
	            logger.info("FTP的IP地址可能错误，请正确配置。");  
	        } catch (IOException e) {  
	            e.printStackTrace();  
	            logger.info("FTP的端口错误,请正确配置。");  
	        }  
	        return ftpClient;  
	    }  
	
	    /* 
	     * 从FTP服务器下载文件 
	     *  
	     * @param ftpHost FTP IP地址 
	     *  
	     * @param ftpUserName FTP 用户名 
	     *  
	     * @param ftpPassword FTP用户名密码 
	     *  
	     * @param ftpPort FTP端口 
	     *  
	     * @param ftpPath FTP服务器中文件所在路径 格式： ftptest/aa 
	     *  
	     * @param localPath 下载到本地的位置 格式：H:/download 
	     *  
	     * @param fileName 文件名称 
	     */  
	    public static void downloadFtpFile(String ftpHost, String ftpUserName,  
	            String ftpPassword, int ftpPort, String ftpPath, String localPath,  
	            String fileName) {  
	        FTPClient ftpClient = null;  
	        try {  
	            ftpClient = getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort);  
	            ftpClient.setControlEncoding("UTF-8"); // 中文支持  
	            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);  
	            ftpClient.enterLocalPassiveMode();  
	            ftpClient.changeWorkingDirectory(ftpPath);  
	  
	            File localFile = new File(localPath + File.separatorChar + fileName);  
	            OutputStream os = new FileOutputStream(localFile);  
	            ftpClient.retrieveFile(fileName, os);  
	            os.close();  
	            ftpClient.logout();  
	  
	        } catch (FileNotFoundException e) {  
	            logger.error("没有找到" + ftpPath + "文件");  
	            e.printStackTrace();  
	        } catch (SocketException e) {  
	            logger.error("连接FTP失败.");  
	            e.printStackTrace();  
	        } catch (IOException e) {  
	            e.printStackTrace();  
	            logger.error("文件读取错误。");  
	            e.printStackTrace();  
	        }  
	  
	    }  
	    
	    
	    
		/* *//**
		 * 下载文件
		 * @param hostname FTP服务器地址
		 * @param port FTP服务器端口号
		 * @param username FTP登录帐号
		 * @param password FTP登录密码
		 * @param pathname FTP服务器文件目录
		 * @param filename 文件名称
		 * @param localpath 下载后的文件路径
		 * @return
		 *//*
		 public static boolean downloadFile(String hostname, int port, String username, String password, String pathname, String filename, String localpath){
		 boolean flag = false;
		 FTPClient ftpClient = new FTPClient();
		 try {
		 //连接FTP服务器
		 ftpClient.connect(hostname, port);
		 //登录FTP服务器
		 ftpClient.login(username, password);
		 //验证FTP服务器是否登录成功
		 int replyCode = ftpClient.getReplyCode();
		 if(!FTPReply.isPositiveCompletion(replyCode)){
		 return flag;
		 }
		 //切换FTP目录
		 ftpClient.changeWorkingDirectory(pathname);
		 FTPFile[] ftpFiles = ftpClient.listFiles();
		 System.out.println(ftpFiles.length);
		 for(FTPFile file : ftpFiles){
		 if(filename.equalsIgnoreCase(file.getName())){
		 File localFile = new File(localpath + "/" + file.getName());
		 OutputStream os = new FileOutputStream(localFile);
		 ftpClient.retrieveFile(file.getName(), os);
		 os.close();
		 }
		 }
		 ftpClient.logout();
		 flag = true;
		 } catch (Exception e) {
		 e.printStackTrace();
		 } finally{
		 if(ftpClient.isConnected()){
		 try {
		 ftpClient.logout();
		 } catch (IOException e) {
		  
		 }
		 }
		 }
		 return flag;
		 }*/
	    
	    /**
	     * 修改之前先删除图片服务器上的旧图片
	     * @Author 于泓磊
	     * @date   2017年11月7日
	     * @param pd      根据当前id获取的当前用户信息
	     * @param imgname 需要修改的数据库的属性
	     * @param imgpath 需要删除的图片的路径
	     */
	    public static void deloldimg(PageData pd, String imgname, String imgpath){
	    	//在调用修改之前先删除服务器上原本图片
//			 String updeploy = Tools.readTxtFileAll(Const.UPDOWNLOADPATH, "UTF-8");
//				String[] split = updeploy.split(",");
				//第一个参数为  图片服务器的地址
				//第二个参数为  图片服务器接口
				//第三/四个参数为  FTP服务器的登录用户名和密码
				String pro = (String) pd.get(imgname);
				if (pro.contains(",")) {
					pro.substring(1);
				}
				String[] s = pro.split(",");
			    for (String string : s) {
			    	System.out.println(string);
			    	//调用ftp工具类删除之前的图片
			    	FTPUtils.deleteFile(UploadProperty.get("upload_ip"), Integer.parseInt(UploadProperty.get("upload_port")), UploadProperty.get("upload_username"),
							UploadProperty.get("upload_password"), imgpath, string.substring(string.lastIndexOf("/")+1));
				}
	    }
	    
	    /**
	     *  FTP单个文件上传
	      * @Description
	      * @Author zhaozhenhua
	      * @date   2018年3月13日
	      * @param mreq   
	      * @param fileName   单个文件上传名
	      * @param path       上传路径
	      * @return DBImgName 图片的路径地址
	      * @throws Exception
	     */
	    public static String upSingleImg(MultipartHttpServletRequest mreq,String fileName,String path){
	    	String uploadFilePath = mreq.getFile(fileName).getOriginalFilename();
			// 截取上传文件的后缀
			String uploadFileSuffix = uploadFilePath.substring(uploadFilePath.indexOf('.') + 1,
					uploadFilePath.length());
			// 用UUID来解决同名文件
			String upload = UUID.randomUUID().toString().replace("-", "");
			// 获取传输过来的Input流
			InputStream is = null;
			try {
				is = mreq.getFile(fileName).getInputStream();
				// 根据txt文件读取ftp工具类上传需要的参数
//				String updeploy = Tools.readTxtFileAll(Const.UPDOWNLOADPATH, "UTF-8");
//				String[] split = updeploy.split(",");
				// 第一个参数为 图片服务器的地址
				// 第二个参数为 图片服务器接口
				// 第三/四个参数为 FTP服务器的登录用户名和密码
				//String path = "businessimgs/firstimg";
//				FTPUtils.uploadFile(split[0], Integer.parseInt(split[1]), split[2], split[3], path,
//						upload + "." + uploadFileSuffix, is);
//				// 通过工具类获取图片服务器地址
//				String imgpath = Tools.readTxtFileAll(Const.IMAGEPATH, "UTF-8");
				String imgpath = UploadProperty.get("upload_domain");
				FTPUtils.uploadFile(UploadProperty.get("upload_ip"), Integer.parseInt(UploadProperty.get("upload_port")), UploadProperty.get("upload_username"),
						UploadProperty.get("upload_password"), path, upload, is);
				String DBImgName= imgpath + path + "/" + upload + "." + uploadFileSuffix;
				return DBImgName;
			} catch (IOException e) {
				e.printStackTrace();
				return "上传错误";
			}finally {
				try {
					is.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
	    }
	    
	    /**
	     * FTP上传多个文件
	      * @Description
	      * @Author zhaozhenhua
	      * @date   2018年3月13日
	      * @param mreq  
	      * @param resp 
	      * @param fileName  多个文件上传名
	      * @param path  上传路径
	      * @return DBImgName 图片的路径地址
	      * @throws Exception
	     */
	    public static String upMultiImgs(MultipartHttpServletRequest mreq,HttpServletResponse resp,String fileName,String path){
	    	List<MultipartFile> fileList = mreq.getFiles(fileName);
	    	String DBImgName="";
	    	for (MultipartFile file : fileList) {
        		//String filePath = "";
        		if (file!=null&&file.getOriginalFilename().length()!=0&&file.getSize()!= 0) {
        			//获得UUID之后的文件名
        			String imgname=UpdImgUtils.getUniqueFileName(file.getOriginalFilename());
        			InputStream in = null;
					try {
						in = file.getInputStream();
						resp.setCharacterEncoding("UTF-8");
						//resp.getWriter().write(filePath+";");
						//根据txt文件读取ftp工具类上传需要的参数
//						String updeploy = Tools.readTxtFileAll(Const.UPDOWNLOADPATH, "UTF-8");
//						String[] split = updeploy.split(",");
						//第一个参数为  图片服务器的地址
						//第二个参数为  图片服务器接口
						//第三/四个参数为  FTP服务器的登录用户名和密码
						//通过工具类获取图片服务器地址
						//String imgpath = Tools.readTxtFileAll(Const.IMAGEPATH, "UTF-8");
						//FTPUtils.uploadFile(split[0], Integer.parseInt(split[1]), split[2], split[3], path, imgname, in);
						String imgpath = UploadProperty.get("upload_domain");
						FTPUtils.uploadFile(UploadProperty.get("upload_ip"), Integer.parseInt(UploadProperty.get("upload_port")), UploadProperty.get("upload_username"),
								UploadProperty.get("upload_password"), path, imgname, in);
						DBImgName+=","+imgpath+path+"/"+imgname;
					} catch (Exception e) {
						e.printStackTrace();
					}finally {
						try {
							in.close();
						} catch (IOException e) {
							e.printStackTrace();
						}
					}
        		}else{
        			System.out.println("FTP上传多个文件为空");
        		}
            }
	    	if(Tools.isEmpty(DBImgName)){
	    		System.out.println("FTP上传多个文件为空");
	    		return null;
	    	}
	    	return DBImgName.substring(1);
	    }
	}

